/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modulo4;

import Modelo.DAL.Personal_DAO;
import Acceso.Security;
import Modelo.PersonalDsi;
import Modelo.PerteneceGrupo;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

/**
 *
 * @author Rafael
 */
public class modificarPersonaAction extends org.apache.struts.action.Action {

    /* forward name="success" path="" */
    private static final String SUCCESS = "success";
    private static final String FAILURE = "failure";

    boolean validarCedula(ActionErrors errors, String cadena, String err, HttpServletRequest request, Pattern p) {
        Matcher m;
        m = p.matcher(cadena);
        if (!m.matches()) {
            errors.add(err, new ActionMessage("errors.invalid_Cedula"));
            saveErrors(request, errors);
            return true;
        }
        return false;
    }

    boolean validarUsbid(ActionErrors errors, String cadena, String err, HttpServletRequest request, Pattern p) {
        Matcher m;
        m = p.matcher(cadena);
        if (!m.matches()) {
            errors.add(err, new ActionMessage("errors.invalid_UsbId"));
            saveErrors(request, errors);
            return true;
        }
        return false;
    }

    boolean validarTelefono(ActionErrors errors, String cadena, String err, HttpServletRequest request, Pattern p) {
        Matcher m;
        m = p.matcher(cadena);
        if (!m.matches()) {
            errors.add(err, new ActionMessage("errors.telefono_letras"));
            saveErrors(request, errors);
            return true;
        }
        return false;
    }

    boolean validarCaracteres(ActionErrors errors, String cadena, String err, HttpServletRequest request, Pattern p) {

        Matcher m;
        m = p.matcher(cadena);

        if (m.find()) {
            errors.add(err, new ActionMessage("errors." + err));
            saveErrors(request, errors);
            return true;
        }
        return false;
    }

    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        String[] a = {"Administrador","Director DSI","Jefe Apoyo Administrativo","Personal Administrativo"};
       if (!Security.validateSession(request, a)) {
            return mapping.findForward("errorPriv");
        }
        System.out.println("Paso Autenticación");

        modificarPersonaForm formBean = (modificarPersonaForm) form;
        ActionErrors errors = new ActionErrors();


        boolean hayError = false;
        boolean momento;
        String voe = formBean.getVoe().trim();
        String ci = formBean.getCi().trim();
        String usbid = formBean.getUsbid();
        String nombre1 = formBean.getNombre1().trim();
        String nombre2 = formBean.getNombre2().trim();
        String apellido1 = formBean.getApellido1().trim();
        String apellido2 = formBean.getApellido2().trim();
        String sexo = formBean.getSexo().trim();
        String edoCivil = formBean.getEdoCivil().trim();
        String fechaNac = formBean.getFechaNac().trim();
        String telefono = formBean.getTelefono().trim();
        String email = formBean.getEmail().trim();
        String profesion = formBean.getProfesion().trim();
        String activo = formBean.getActivo().trim();
        String sede = formBean.getSede().trim();
        String tipoPersonal = formBean.getTipoPersonal().trim();
        String idHorario = formBean.getIdHorario().trim();
        String funcion = formBean.getFuncion();
        String idGrupo = formBean.getIdGrupo().trim();
        String transporte = formBean.getTransporte().trim();
        String login = formBean.getLogin().trim();

        Pattern p;

        // Objetos Necesarios Para la Inserción
        PersonalDsi pDSI = new PersonalDsi();
        PerteneceGrupo PG = new PerteneceGrupo();
        Personal_DAO conexionPersonal = new Personal_DAO();


        // Validamos que la cedula no sea nula
        if (ci == null || ci.length() < 1) {
            errors.add("falta_Cedula", new ActionMessage("errors.falta_Cedula"));
            saveErrors(request, errors);
            hayError = true;
        }

        //Comprueba que el campo cedula solo tenga numeros
        p = Pattern.compile("[0-9]*");
        momento = validarCedula(errors, ci, "invalid_Cedula", request, p);
        hayError = (momento || hayError);

        String CIcompuesta = voe + "-" + ci;

        // Validamos el USBID no sea nulo
        if (usbid == null || usbid.length() < 1) {
            errors.add("falta_usbid", new ActionMessage("errors.falta_usbid"));
            saveErrors(request, errors);
            hayError = true;
        }

        //Comprueba que el campo usbid solo tenga letras
        p = Pattern.compile("[a-zA-Z]+");
        momento = validarUsbid(errors, usbid, "invalid_UsbId", request, p);
        hayError = (momento || hayError);


        // validamos que el primer nombre no sea nulo
        if (nombre1 == null || nombre1.length() < 1) {
            errors.add("falta_Nombre", new ActionMessage("errors.falta_Nombre"));
            saveErrors(request, errors);
            hayError = true;
        }


        // validamos que el primer apellido no sea nulo
        if (apellido1 == null || apellido1.length() < 1) {
            errors.add("falta_Apellido", new ActionMessage("errors.falta_Apellido"));
            saveErrors(request, errors);
            hayError = true;
        }

        // longitud del nombre
        if (nombre1.length() < 2) {
            errors.add("long_Nombre", new ActionMessage("errors.long_Nombre"));
            saveErrors(request, errors);
            hayError = true;
        }


        // longitud apellido
        if (apellido1.length() < 2) {
            errors.add("long_Apellido", new ActionMessage("errors.long_Apellido"));
            saveErrors(request, errors);
            hayError = true;
        }

        // comprueba que el campo solo tenga caracteres a-z
        p = Pattern.compile("[^a-zA-Záéíóú ]+");
        momento = validarCaracteres(errors, nombre1, "invalid_caracter_N1", request, p);
        hayError = (momento || hayError);
        momento = validarCaracteres(errors, apellido1, "invalid_caracter_A1", request, p);
        hayError = (momento || hayError);
        momento = validarCaracteres(errors, nombre2, "invalid_caracter_N2", request, p);
        hayError = (momento || hayError);
        momento = validarCaracteres(errors, apellido2, "invalid_caracter_A2", request, p);
        hayError = (momento || hayError);

        // Verificamos que ingresen la fecha
        if (fechaNac == null || fechaNac.length() < 1) {
            errors.add("faltaFecha", new ActionMessage("errors.faltaFecha"));
            saveErrors(request, errors);
            hayError = true;
        }

        // Debo chequear que la fecha sea menor a la fecha actual
        Calendar calendario = GregorianCalendar.getInstance();
        Date fecha;
        Date fecha2;
        SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
        String fechaAct = formatoDeFecha.format(calendario.getTime());

        try {
            fecha = formatoDeFecha.parse(fechaNac);
            fecha2 = formatoDeFecha.parse(fechaAct);

            if (!fecha.before(fecha2)) {
                errors.add("invalid_fechaNac", new ActionMessage("errors.invalid_fechaNac"));
                saveErrors(request, errors);
                hayError = true;
                //JOptionPane.showMessageDialog(null, "fecha despues o igual" + fecha, "Salida del Action", 1);
            }
        } catch (ParseException ex) {
            hayError = true;
            fecha = calendario.getTime();
        }

        // Valido que el Telefono solo tenga numeros
        p = Pattern.compile("[0-9]*");
        momento = validarTelefono(errors, telefono, "telefono_letras", request, p);
        hayError = (momento || hayError);


        //Chequeamos que tenga una arroba
        if (!(email.length() < 1) && email.indexOf("@") == -1) {
            errors.add("invalid_Email", new ActionMessage("errors.invalid_Email"));
            saveErrors(request, errors);
            hayError = true;
        }

        // Validamos que el grupo no sea nulo
        if (idGrupo == null || idGrupo.length() < 1) {
            errors.add("falta_grupoid", new ActionMessage("errors.falta_grupoid"));
            saveErrors(request, errors);
            hayError = true;
        }

        if (!hayError) {

            // Busco la cedula en la comunidad universitaria a ver sis existe
            // Chequeo si la cedula se encuentra en la comunidad universitaria
            // FALTA CHEQUEAR PERSONAL EXISTE

            // CREO EL OBJETO COMUNIDAD UNIVERSITARIA
            pDSI.setCi(CIcompuesta);
            pDSI.setNombre1(nombre1);
            pDSI.setNombre2(nombre2);
            pDSI.setApellido1(apellido1);
            pDSI.setApellido2(apellido2);
            telefono = telefono.trim().replaceAll(" ", "");

            if (telefono.length() > 0) {
                pDSI.setTelefono(Integer.parseInt(telefono));
            } else {
                pDSI.setTelefono(0);
            }

            pDSI.setEmail(email);
            pDSI.setProfesion(profesion);


            pDSI.setCi(CIcompuesta);
            pDSI.setUsbid(usbid);
            pDSI.setSexo(sexo.charAt(0));
            pDSI.setEstadoCivil(edoCivil);
            pDSI.setFechaNacimiento(fecha);
            pDSI.setActivo(activo);
            pDSI.setTipoPersonal(tipoPersonal);
            pDSI.setSede(sede);

            // Coprobar que el login no sea usado por nadie más FALTA

            // ahora voy con lo de la tabla PersonalDSI
            pDSI.setCi(CIcompuesta); // ;p tengo y no hay que hacer nada
            pDSI.setLogin(login);
            pDSI.setHorario(Long.parseLong(idHorario));
            pDSI.setTransporte(transporte); // lo tengo


            if (Personal_DAO.existeGrupo(idGrupo, sede)) {
                PG.setCi(CIcompuesta);
                PG.setIdGrupo(idGrupo);
                PG.setSede(sede);
                PG.setFuncion(funcion);
            } else {
                hayError = true;
                errors.add("grupo_no_existe", new ActionMessage("errors.grupo_no_existe"));
                saveErrors(request, errors);
            }

//            if (conexionPersonal.existeRol(nombreRol)) {
//                pDSI.setNombreRol(nombreRol);
//            } else {
//                hayError = true;
//                errors.add("rol_no_existe", new ActionMessage("errors.rol_no_existe"));
//                saveErrors(request, errors);
//            }
        }

        if (!hayError) {
            if (Personal_DAO.modificarPersonal(pDSI, PG)) {
                System.out.println("\n\n\n\nModificoO\n");
                errors.add("persona_modificada", new ActionMessage("errors.persona_modificada"));
                saveErrors(request, errors);
                return mapping.findForward(SUCCESS);
            } else {
                System.out.println("\n\n\n\nNO modifico1\n");
                errors.add("persona_No_modificada", new ActionMessage("errors.persona_No_modificada"));
                saveErrors(request, errors);
                return mapping.findForward(FAILURE);
            }
        } else {
            System.out.println("\n\n\n\nNO modifico2\n");
            errors.add("persona_No_modificada", new ActionMessage("errors.persona_No_modificada"));
            saveErrors(request, errors);
            return mapping.findForward(FAILURE);
        }
    }
}
